using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Web;
using BEL;
using AEL.BOD;


namespace APR
{
  public class AP_Bod_Baja : IAPR
  {
      #region Adapter
      private CEL.BOD.DO_Bod_Baja _adpBod_Baja;
       private CEL.BOD.DO_Bod_Baja adpBod_Baja
      {
          get
          {
              if (_adpBod_Baja == null)
                  _adpBod_Baja = new CEL.BOD.DO_Bod_Baja();
              return _adpBod_Baja;
          }
      }
      #endregion

      #region Operacion de datos
      public void EmitirExcepcion(string mensaje, string caso)
      {
          Exception eCaso = new System.Exception(caso);
          Exception otroEX = new System.Exception(mensaje, eCaso);
          throw otroEX;
      }

      public bool Adelante(Scope s, object p_Objeto, string p_Proceso)
      {
          Bod_Baja p_Objeto_ = (Bod_Baja)p_Objeto;
          if (p_Objeto_.Estado == "PEN" && p_Proceso == "ORD")
          {
              try
              {
                  adpBod_Baja.Adapter.BeginTransaction();
                  DEL.BOD.DO_Bod_Baja.Insert_Orden(s, ref p_Objeto_);
                  Bod_Baja p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                  p_Objeto_Nuevo.Estado = p_Proceso;
                  p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                  if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                  {
                      p_Objeto_ = p_Objeto_Nuevo;
                  }
                  adpBod_Baja.Adapter.CommitTransaction();
              }
              catch (Exception e)
              {
                  adpBod_Baja.Adapter.RollbackTransaction();
                  if (e.Message.StartsWith("MSJ"))
                  { throw (e); }
                  else
                  { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
              }
              try
              {
                  adpBod_Baja.Adapter.BeginTransaction();
                  p_Proceso = "KAR";
                  DEL.BOD.DO_Bod_Baja.Insert_Kardex(s, ref p_Objeto_);
                  Bod_Baja p_Objeto_Nuevo1 = CopiarObjeto(p_Objeto_);
                  List<Bod_Baja> lstBodBaja = adpBod_Baja.GetById(s, p_Objeto_.Id);
                  p_Objeto_.Fecha_Update = lstBodBaja[0].Fecha_Update;
                  p_Objeto_Nuevo1.Estado = p_Proceso;
                  p_Objeto_Nuevo1.Fecha_Update = DateTime.Now;
                  if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo1))
                  {
                      p_Objeto_ = p_Objeto_Nuevo1;
                  }
                  adpBod_Baja.Adapter.CommitTransaction();
              }
              catch (Exception e)
              {
                  adpBod_Baja.Adapter.RollbackTransaction();
                  if (e.Message.StartsWith("MSJ"))
                  { throw (e); }
                  else
                  { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
              }
          }
          else if (p_Objeto_.Estado == "ORD" && p_Proceso == "KAR")
          {
              try
              {
                  adpBod_Baja.Adapter.BeginTransaction();
                  DEL.BOD.DO_Bod_Baja.Insert_Kardex(s, ref p_Objeto_);
                  Bod_Baja p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                  p_Objeto_Nuevo.Estado = p_Proceso;
                  p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                  if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                  {
                      p_Objeto_ = p_Objeto_Nuevo;
                  }
                  adpBod_Baja.Adapter.CommitTransaction();
              }
              catch (Exception e)
              {
                  adpBod_Baja.Adapter.RollbackTransaction();
                  if (e.Message.StartsWith("MSJ"))
                  { throw (e); }
                  else
                  { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
              }
          }
          return true;
      }

      public bool Atras(Scope s, object p_Objeto, string p_Proceso)
      {
          Bod_Baja p_Objeto_ = (Bod_Baja)p_Objeto;
          if (p_Objeto_.Estado == "KAR" && p_Proceso == "ORD")
          {
              try
              {
                  adpBod_Baja.Adapter.BeginTransaction();
                  DEL.BOD.DO_Bod_Baja.Delete_Kardex(s, ref p_Objeto_);
                  Bod_Baja p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                  p_Objeto_Nuevo.Estado = p_Proceso;
                  p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                  if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                  {
                      p_Objeto_ = p_Objeto_Nuevo;
                  }
                  adpBod_Baja.Adapter.CommitTransaction();
              }
              catch (Exception e)
              {
                  adpBod_Baja.Adapter.RollbackTransaction();
                  if (e.Message.StartsWith("MSJ"))
                  { throw (e); }
                  else
                  { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
              }
              try
              {
                  adpBod_Baja.Adapter.BeginTransaction();
                  p_Proceso = "PEN";
                  DEL.BOD.DO_Bod_Baja.Delete_Orden(s, ref p_Objeto_);
                  Bod_Baja p_Objeto_Nuevo1 = CopiarObjeto(p_Objeto_);
                  List<Bod_Baja> lstBodBaja = adpBod_Baja.GetById(s, p_Objeto_.Id);
                  p_Objeto_.Fecha_Update = lstBodBaja[0].Fecha_Update;
                  p_Objeto_Nuevo1.Estado = p_Proceso;
                  p_Objeto_Nuevo1.Fecha_Update = DateTime.Now;
                  if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo1))
                  {
                      p_Objeto_ = p_Objeto_Nuevo1;
                  }
                  adpBod_Baja.Adapter.CommitTransaction();
              }
              catch (Exception e)
              {
                  adpBod_Baja.Adapter.RollbackTransaction();
                  if (e.Message.StartsWith("MSJ"))
                  { throw (e); }
                  else
                  { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
              }
          }
          else if (p_Objeto_.Estado == "ORD" && p_Proceso == "PEN")
          {
              try
              {
                  adpBod_Baja.Adapter.BeginTransaction();
                  DEL.BOD.DO_Bod_Baja.Delete_Orden(s, ref p_Objeto_);
                  Bod_Baja p_Objeto_Nuevo = CopiarObjeto(p_Objeto_);
                  p_Objeto_Nuevo.Estado = p_Proceso;
                  p_Objeto_Nuevo.Fecha_Update = DateTime.Now;
                  if (Actualizar(s, p_Objeto_, p_Objeto_Nuevo))
                  {
                      p_Objeto_ = p_Objeto_Nuevo;
                  }
                  adpBod_Baja.Adapter.CommitTransaction();
              }
              catch (Exception e)
              {
                  adpBod_Baja.Adapter.RollbackTransaction();
                  if (e.Message.StartsWith("MSJ"))
                  { throw (e); }
                  else
                  { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
              }
          }
          return true;
      }


      public object GetById(Scope s, string p_Id)
      {
          List<Bod_Baja> resultado = new List<Bod_Baja>(1);
          try
          {
              resultado = adpBod_Baja.GetById(s, p_Id);
          }
          catch
          {
              EmitirExcepcion(TXT_Mensajes._MSJ47, p_Id);
          }

          if (resultado.Count == 0)
              EmitirExcepcion(TXT_Mensajes._MSJ47, p_Id);

          return resultado[0];
      }

        //Bod_Baja nuevoObjeto;
      public bool Actualizar(Scope s, object p_Objeto_Original, object p_Objeto)
      {
          Bod_Baja v_Objeto_ = (Bod_Baja)p_Objeto;
          Bod_Baja v_Objeto_Original_ = (Bod_Baja)p_Objeto_Original;
          int estadoId = adpBod_Baja.Update(s, v_Objeto_, v_Objeto_Original_);
          return true;
      }

      public bool Permiso(Scope s, object p_Objeto, string p_Proceso)
      {
          throw new NotImplementedException();
      }


      private Bod_Baja CopiarObjeto(Bod_Baja p_Objeto)
      {
          Bod_Baja nuevoObjeto = new Bod_Baja(p_Objeto);
          return nuevoObjeto;
      }
      #endregion 

  }
}
